iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0
Software Development

RISC-V 與處理器之架構學習及應用系列 第 6

[Day06] 工具介紹:Ripes

  • 分享至 

  • xImage
  •  

一、Ripes 簡單說明

二、使用 Ripes 模擬器來解釋程式的每個功能和指令的操作

  • Ripes 是一個視覺化的 RISC-V 模擬器,用於模擬 RISC-V 架構的 CPU 運行過程。它允許使用者以視覺化的方式查看 RISC-V 組合語言程式的執行,包括每個指令在處理器的不同階段(如取指令階段 IF、指令解碼 ID、指令執行 IE、存取記憶體階段 MEM 和寫回階段 WB)的詳細狀況。
  1. 暫存器寫入/啟用訊號:當某個暫存器被寫入時,模擬器會顯示相關的訊號。
  2. 多工器輸入選擇(Multiplexer Input Selection):在某些情況下,程式會使用多工器來選擇不同的資料來源,這些都可能影響後續的操作。
  3. 程式的每個階段:RISC-V 處理器分為多個階段,通常包括以下五個階段:
    • IF(Instruction Fetch):指令擷取,從記憶體中讀取即將執行的指令。
    • ID(Instruction Decode):指令解碼,將讀取到的指令進行解釋,並確定需要哪些暫存器和操作數。
    • IE(Instruction Execute):指令執行,實際執行指令的運算。
    • MEM(Memory Access):存取記憶體階段,如果指令需要讀寫記憶體,這一步會進行存取。
    • WB(Write Back):寫回階段,將執行結果寫回到暫存器。
  4. 記憶體更新步驟:如果程式需要對記憶體進行更新,例如載入資料或寫入結果,就會需要這步驟。

三、範例

# This example shows an implementation of the mathematical
# factorial function (! function) to find the factorial value of !7 = 5040.

.data
argument: .word   7
str1:     .string "Factorial value of "
str2:     .string " is "

.text
main:
        lw  a0, argument   # Load argument from static data
        jal ra, fact       # Jump-and-link to the 'fact' label

        # Print the result to console
        mv  a1, a0
        lw  a0, argument
        jal ra, printResult

        # Exit program
        li a7, 10
        ecall

fact:
        addi sp, sp, -16
        sw   ra, 8(sp)
        sw   a0, 0(sp)
        addi t0, a0, -1
        bge  t0, zero, nfact

        addi a0, zero, 1
        addi sp, sp, 16
        jr x1

nfact:
        addi a0, a0, -1
        jal  ra, fact
        addi t1, a0, 0
        lw   a0, 0(sp)
        lw   ra, 8(sp)
        addi sp, sp, 16
        mul a0, a0, t1
        ret

# --- printResult ---
# a0: Value which factorial number was computed from
# a1: Factorial result
printResult:
        mv t0, a0
        mv t1, a1
        la a0, str1
        li a7, 4
        ecall
        mv a0, t0
        li a7, 1
        ecall
        la a0, str2
        li a7, 4
        ecall
        mv a0, t1
        li a7, 1
        ecall
        ret

四、範例解說

這段c code 是一個在 RISC-V 上實作數學 階乘函數(factorial function)的範例,目標是計算 7 的階乘(即 7! = 5040),並將結果輸出到控制台。以下是分步解釋:

1. 資料區段 (.data)

這個部分定義了靜態資料,包括要計算的參數和一些字串:

  • argument: 定義要計算階乘的數字,這裡是 7
  • str1: 定義字串 "Factorial value of "。
  • str2: 定義字串 " is "。

2. 程式區段 (.text)

這裡是實際的程式碼,包括主程式 main,階乘計算函數 fact,以及結果輸出的 printResult

主程式(main

  1. lw a0, argument: 從資料區段載入 argument,即要計算的數字 7,並存入暫存器 a0
  2. jal ra, fact: 跳到 fact 標籤,開始計算階乘,並將返回地址存入 ra 暫存器。
  3. mv a1, a0: 把階乘計算結果從 a0 移動到 a1,這是為了後續輸出。
  4. lw a0, argument: 再次載入 argument,為了在輸出時顯示原始數字。
  5. jal ra, printResult: 跳到 printResult 函數進行結果輸出。
  6. li a7, 10: 設定 a7 暫存器為 10,這是系統呼叫的代碼,用於退出程式。
  7. ecall: 執行系統呼叫,退出程式。

階乘函數(fact

這裡是計算階乘的遞迴函數。

  1. addi sp, sp, -16: 將堆疊指標 sp 向下移動 16 字節,為儲存資料預留空間。
  2. sw ra, 8(sp): 將返回地址 ra 存入堆疊。
  3. sw a0, 0(sp): 將目前的參數 a0(即階乘的值)存入堆疊。
  4. addi t0, a0, -1: 將 a0 減去 1,存入暫存器 t0,準備比較。
  5. bge t0, zero, nfact: 如果 t0 大於或等於 0,跳到 nfact,否則返回 1(表示遞迴結束)。

如果數字小於等於 1,則返回 1:

  1. addi a0, zero, 1: 將 a0 設為 1。
  2. addi sp, sp, 16: 將堆疊指標 sp 恢復。
  3. jr x1: 返回主程式。

非基底情況(nfact

處理當 a0 > 1 的情況:

  1. addi a0, a0, -1: 將 a0 減去 1。
  2. jal ra, fact: 再次呼叫 fact 函數,進行遞迴。
  3. addi t1, a0, 0: 將結果存入 t1 暫存器。
  4. lw a0, 0(sp): 從堆疊中取回原本的參數。
  5. lw ra, 8(sp): 從堆疊中取回返回地址。
  6. addi sp, sp, 16: 將堆疊指標 sp 恢復。
  7. mul a0, a0, t1: 計算階乘結果(a0 = a0 * t1)。
  8. ret: 返回主程式。

輸出結果的 printResult 函數

負責將計算結果輸出到控制台:

  1. 將要輸出的字串載入 a0,然後通過 ecall 系統呼叫輸出:
    • 先輸出字串 "Factorial value of "。
    • 再輸出原始數字。
    • 再輸出字串 " is "。
    • 最後輸出計算出的階乘值。

五、接下來的目標

將編寫RISC-V彙編程式(RV32I ISA)並透過環境呼叫輸出到控制台。

1. 實作主題

  • 一個簡化但資訊豐富的實作。
  • 範例:無分支計數前導零運算實現log2、使用bfloat16進行矩陣乘法。

2. 指令集限制

  • 僅使用RV32I指令進行程式編寫,不使用M或F/D擴充
  • 不依賴C編譯器產生組件例程,需從頭開始編寫RISC-V彙編程式碼

3. 測試資料

  • 程式中必須包含至少3個測試資料
  • Can inline the predefined data,不接受外部資料集。

4. 程式要求

  • 程式必須包含循環遞歸呼叫,以及條件分支,尤其是測試範例中。
  • 展示增強程式的迭代工作,減少程式碼大小最小化運行時開銷,並進行明確的測量。

5. RISC-V組件驗證

  • 自行撰寫RISC-V組件,但可以驗證C編譯器輸出,並描述整個過程。

6. 模擬器要求

7. 使用Ripes模擬器進行解釋

  • 使用Ripes模擬器解釋程式功能及指令操作。
  • 利用暫存器寫入/啟用訊號多工器輸入選擇等視覺化訊號,描述應用程式運行過程。
  • 提供每個階段(IF、ID、IE、MEM、WB)的範例,並解釋適當的記憶體更新步驟

上一篇
[Day05] RISC-V Instructions (3/3)
下一篇
[Day07] RISC-V Data Transfer 資料轉移
系列文
RISC-V 與處理器之架構學習及應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言